package ch06
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.utils.setTimeout;

	import utils.Ball;

	/**
	 * 移除对象.
	 * 如果对象是不断产生的，那么使用一次性删除对象的方法是非常有效的。
	 * 被删除的对象将会由新的对象所取代，这样舞台就永远不为空。
	 * @author sjp
	 *
	 */
	public class Removal extends Sprite
	{
		private var count:int=20;
		private var balls:Array;

		public function Removal()
		{
			init();
		}

		private function init():void
		{
			stage.scaleMode=StageScaleMode.NO_SCALE;
			stage.align=StageAlign.TOP_LEFT;
			setTimeout(delayHandler, 500);

		}

		private function delayHandler():void
		{
			balls=new Array();
			for (var i:int=0; i < count; i++)
			{
				var ball:Ball=new Ball(10);
				ball.x=Math.random() * stage.stageWidth;
				ball.y=Math.random() * stage.stageHeight;
				ball.vx=Math.random() * 5 - 10;
				ball.vy=Math.random() * 5 - 10;
				addChild(ball);
				balls.push(ball);
			}
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		private function onEnterFrame(event:Event):void
		{
			/**
			 * 大家也许注意到了本例中的 for 语句，
			 * 与其它例子中的不太一样： for(var i:Number = balls.length - 1; i > 0; i--)
			 * 这是让 for 循环倒着执行，遍历整个数组。因为如果在数组中使用 splice ，数组的索引就会改变。
			 * */
			for (var i:Number=balls.length - 1; i >= 0; i--)
			{
				var ball:Ball=Ball(balls[i]);
				ball.x+=ball.vx;
				ball.y+=ball.vy;
				if (ball.x - ball.radius > stage.stageWidth || ball.x + ball.radius < 0 || ball.y - ball.radius > stage.stageHeight || ball.y + ball.radius < 0)
				{
					removeChild(ball);
					balls.splice(i, 1);
					if (balls.length <= 0)
					{
						removeEventListener(Event.ENTER_FRAME, onEnterFrame);
					}
				}
			}
		}
	}
}